/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.util.Duration;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import transervfx.Dato.Entidad.Encomienda;
import transervfx.Dato.Entidad.TipoEncomienda;
import transervfx.Dato.Entidad.TipoServicio;
import transervfx.Dato.Entidad.TipoTramite;
import transervfx.Dato.Validacion.ValidacionesNivelBD;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorTipoServicio;
import transervfx.Vista.XML.pathRecusosFXML;

/**
 * FXML Controller class
 *
 * @author meli
 */
public class CrearTipoServicio extends VentanaModal {

    
    
    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 500;
    
  
    @FXML
    private ComboBox<String> tipoServicio;
    @FXML
    private TextField nombre;
    @FXML
    private TextArea descripcion;
    @FXML
    private TextField prioridad;
    @FXML
    private TextField precio;
    
    private TipoServicio tipoServicioView;
    
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();

   
    public CrearTipoServicio(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        initialize(null,null);
    }
    
    public void initialize(URL url, ResourceBundle rb) {

        //Agregamos un listener para saber si selecciona una encomienda o un tramite
        eventoSeleccionarTipoServicio();

        this.tipoServicio.getSelectionModel().select(0);
    }

    //Dependiendo del tipo de servicio que elija, se haran diferentes bindings, uno para un tipo de servicio encomienda
    //y otro para tramite
    private void eventoSeleccionarTipoServicio() {
        tipoServicio.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> selected, String oldValue, String newValue) {
                if (newValue != null) {
                    //en vez de hacer dos azquerosos if se podria hacer mejor pero lo dejo haci para q se entienda
                    //si poq sino me vas a marear
                    if (newValue.equals("Encomienda")) {
                        try {
                            //desvinculo todo, los binding anteriores y los escuchadores, para q la ventana qde limpia
                            desvincularView();
                            
                            //si esta en la propia clase, igual este desvincular saca hasta los listener o escuchadores 
                            //creo instancia de encomienda                           
                            tipoServicioView = new TipoEncomienda();
                            
                            //linkeo o hago un binding con los componentes,
                            bindingInterfazConBean(tipoServicioView);
                            
                            //agrego los escuchadores
                            crearEscuchadores();
                            
                        } catch (NoSuchMethodException ex) {
                            Logger.getLogger(CrearTipoServicio.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
                        if (newValue.equals("Trámite")) {
                            try {
                                //desvinculo todo, los binding anteriores y los escuchadores, para q la ventana qde limpia
                                desvincularView();
                                
                                //si esta en la propia clase, igual este desvincular saca hasta los listener o escuchadores 
                                //creo instancia de encomienda                           
                                tipoServicioView = new TipoTramite();
                                
                                //linkeo o hago un binding con los componentes,
                                bindingInterfazConBean(tipoServicioView);
                                
                                //agrego los escuchadores
                                crearEscuchadores();
                                
                            } catch (NoSuchMethodException ex) {
                                Logger.getLogger(CrearTipoServicio.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                }
            }
        });
    }
    
    
    private void bindingInterfazConBean(TipoServicio tipoServicioView) throws NoSuchMethodException {
        
        tipoServicioView.getPROP_NOMBRE().bind(nombre.textProperty());
        tipoServicioView.getPROP_DESCRIPCION().bind(descripcion.textProperty());
        tipoServicioView.getPROP_PRIORIDAD().bind(prioridad.textProperty());
        //tipoServicioView.getPROP_PRECIO().bind(precio.textProperty());
    }

    private void crearEscuchadores() {
        
        this.tipoServicio.valueProperty().addListener(this.escuchadorInput);
        this.nombre.textProperty().addListener(this.escuchadorInput);
        this.descripcion.textProperty().addListener(this.escuchadorInput);
        this.prioridad.textProperty().addListener(this.escuchadorInput);
        this.precio.textProperty().addListener(this.escuchadorInput);
    }

    //deja limpia la intefaz, es decir, lo desvincula del beans
    private void desvincularView() {
        //esto es porq el servicio no fue creado
        if (this.tipoServicioView != null) {
            //limpia los escuchadores de validacion
            this.tipoServicio.valueProperty().removeListener(this.escuchadorInput);
            this.nombre.textProperty().removeListener(this.escuchadorInput);
            this.descripcion.textProperty().removeListener(this.escuchadorInput);
            this.prioridad.textProperty().removeListener(this.escuchadorInput);
            this.precio.textProperty().removeListener(this.escuchadorInput);
            //desvincula el beans con la interfaz
            tipoServicioView.unbindingALL();
        }
    }
    
    
    public void buttonAceptar() throws NoSuchMethodException, IOException {

        if (this.tipoServicio != null) {
            
            if (validarCampos()) {

                GestorTipoServicio.getInstance().guardarTipoServicio(tipoServicioView);
                System.out.println("Tipo de servicio guardado");
                this.close();

            } else {
                //Aca deberiamos pintar los campos que estan mal ingresados o los campos
                //obligatorios que faltan.
            }

        }
    }

    public boolean validarCampos() {
        return true;
    }

    public void buttonCancelar(ActionEvent event) {
        System.out.println(((Button) event.getSource()).getText());
        this.close();
    }

   
    
    ChangeListener escuchadorInput = new ChangeListener<String>() {
        @Override
        public void changed(
                ObservableValue observableValue, String s, String s1) {

            if (!s1.equals(s)) {
                // delay location updates to we don't go too fast file typing
                final Control control = ((Control) ((Property) observableValue).getBean());

                // si esta corriendo lo detengo
                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent actionEvent) {

                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                //solo valido a nivel logico
                                //validar(control, ValidacionesNivelLogico.class, null);
                            }
                        }));
                locationUpdateTimeline.play();

            }

        }
    };
    
    
     @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("CrearTipoServicioFXML.fxml");
    }
}
